% tkz-obj-eu-arcs.tex
% Copyright 2020  Alain Matthes
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status “maintained”.
%
% The Current Maintainer of this work is Alain Matthes.


%  utf8 encoding
\def\fileversion{3.06c}
\def\filedate{2020/04/06}
\typeout{2020/04/06 3.06c tkz-obj-eu-arcs.tex}
\makeatletter
%<------------------------------  Arcs -------------------------------------–
% options : delta
% \def\tkz@delta{0}
% \tikzset{arc style/.style={#1}}
% \pgfkeys{/tikz/.cd,delta/.code={\def\tkz@delta{#1}}}
\tikzset{arc style/.style={gray,thin}}
\gdef\tkz@numa{0}
\pgfkeys{/tkzdrawarc/.cd,
      type/.is choice,
      type/towards/.code               = \def\tkz@numa{0},
      type/rotate/.code                = \def\tkz@numa{1},
      type/angles/.code                = \def\tkz@numa{2},
      type/R/.code                     = \def\tkz@numa{3},
      type/R with nodes/.code          = \def\tkz@numa{4},
      towards/.style                   = {type=towards},
      rotate/.style                    = {type=rotate},
      R/.style                         = {type=R},
      angles/.style                    = {type=angles},
      R with nodes/.style              = {type=R with nodes},
      diameter/.code                   = {},
      arc/.code                        = {},
      size/.code                       = {},
      mark/.code                       = {},
      mkpos/.code                      = {},
      mksize/.code                     = {},
      mkcolor/.code                    = {},
      type/.default                    =  towards,
      delta/.store in                  = \tkz@delta,
      delta                            = 0,
      /tkzdrawarc/.search also         = {/tikz}
}
\def\tkzDrawArc{\pgfutil@ifnextchar[{\tkz@DrawArc}{\tkz@DrawArc[]}}
\def\tkz@DrawArc[#1](#2,#3)(#4){%
\begingroup
\pgfqkeys{/tkzdrawarc}{#1}
\ifcase\tkz@numa%
   \tkzDrawArcTowards[#1](#2,#3)(#4)
\or% 1
   \tkzDrawArcRotate[#1](#2,#3)(#4)
\or% 2
   \tkzDrawArcAngles[#1](#2,#3)(#4)
\or% 3
   \tkzDrawArcRAngles[#1](#2,#3)(#4)
 \or% 4
   \tkzDrawArcR[#1](#2,#3)(#4)
\fi
\endgroup
}
%<--------------------------------------------------------------------------–>
%  ARC    nodes        #2 center #3 first point last point #4
% delta un peu plus à chaque extrémité
% example : \tkzDrawArc(A,B)(C)
%<--------------------------------------------------------------------------–>
\def\tkzDrawArcTowards{\pgfutil@ifnextchar[{\tkz@DrawArcN}{\tkz@DrawArcN[]}}
\def\tkz@DrawArcN[#1](#2,#3)(#4){%
\begingroup
  \tkzCalcLength(#2,#3)\tkzGetLength{tkz@radius}
  \tkzFindSlopeAngle(#2,#3)\tkzGetAngle{tkz@FirstAngle}
  \tkzFindSlopeAngle(#2,#4)\tkzGetAngle{tkz@SecondAngle}
  \tkz@DrawArcRAngles[#1](#2,\tkz@radius pt)(\tkz@FirstAngle,\tkz@SecondAngle)
\endgroup
}
%<--------------------------------------------------------------------------–>
%    nodes                 #2 center #3 first point rotate #4 with Angle
% delta un peu plus à chaque extrémité
% tkzDrawArcRotate(O,A)(60)
%<--------------------------------------------------------------------------–>
\def\tkzDrawArcRotate{\pgfutil@ifnextchar[{\tkz@DrawArcRotate}{%
                                           \tkz@DrawArcRotate[]}}
\def\tkz@DrawArcRotate[#1](#2,#3)(#4){%
\begingroup
  \tkzCalcLength(#2,#3)     \tkzGetLength{tkz@radius}
  \tkzFindSlopeAngle(#2,#3)   \tkzGetAngle{tkz@FirstA}
  \pgfmathadd{\tkz@FirstA}{#4}
  \edef\tkz@SecondA{\pgfmathresult}
    \pgfmathgreaterthan{#4}{0}
  \ifdim\pgfmathresult pt=1 pt\relax%
    \tkz@DrawArcRAngles[#1](#2,\tkz@radius pt)(\tkz@FirstA,\tkz@SecondA)
  \else
    \tkz@DrawArcRAngles[#1](#2,\tkz@radius pt)(\tkz@SecondA,\tkz@FirstA)
  \fi
  \endgroup
}
%<--------------------------------------------------------------------------–>
%  deux angles
% \tkzDrawArcAngles(O,A)(0,60)
%<--------------------------------------------------------------------------–>
\def\tkzDrawArcAngles{\pgfutil@ifnextchar[{\tkz@DrawArcAngles}{%
                                           \tkz@DrawArcAngles[]}}
\def\tkz@DrawArcAngles[#1](#2,#3)(#4,#5){%
\begingroup
    \tkzCalcLength(#2,#3)
    \tkz@DrawArcRAngles[#1](#2,\tkzLengthResult pt)(#4,#5)
\endgroup
}
%<--------------------------------------------------------------------------–>
%    Degree      #2 center #4 - #3 radius from #5 (degree) to #6(degree)
%<--------------------------------------------------------------------------–>
\def\tkzDrawArcRwithNodes{\pgfutil@ifnextchar[{\tkz@DrawArcRwithNodes}{%
                                            \tkz@DrawArcRwithNodes[]}}
\def\tkz@DrawArcRwithNodes[#1](#2,#3,#4)(#5,#6){%
\begingroup
  \tkzCalcLength(#3,#4)
  \tkzFindSlopeAngle(#2,#5)\tkzGetAngle{tkz@FirstAngle}
  \tkzFindSlopeAngle(#2,#6)\tkzGetAngle{tkz@SecondAngle}
  \tkz@DrawArcRAngles[#1](#2,\tkzLengthResult)(\tkz@FirstAngle,\tkz@SecondAngle)
\endgroup
}
%<--------------------------------------------------------------------------–>
%    Nodes R  #2 center #3 radius en cm  from #4(node) to #5(node)
%  \tkzDrawArcR(O,2 cm)(A,B)
%<--------------------------------------------------------------------------–>
\def\tkzDrawArcR{\pgfutil@ifnextchar[{\tkz@DrawArcR}{\tkz@DrawArcR[]}}
\def\tkz@DrawArcR[#1](#2,#3)(#4,#5){%
\begingroup
   \tkzFindSlopeAngle(#2,#4)\tkzGetAngle{tkz@FirstAngle}
   \tkzFindSlopeAngle(#2,#5)\tkzGetAngle{tkz@SecondAngle}
   \tkz@DrawArcRAngles[#1](#2,#3)(\tkz@FirstAngle,\tkz@SecondAngle)
\endgroup
}
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
% #1 center #2 radius #4 first angle (degree) #5 second angle  (degree)
% angles  0 .. 180 or -180 .. 0
%<--------------------------------------------------------------------------–>
% example : \tkzDrawArc(A,2 cm)(30,90)
\def\tkzDrawArcRAngles{\pgfutil@ifnextchar[{\tkz@DrawArcRAngles}{%
                                            \tkz@DrawArcRAngles[]}}
\def\tkz@DrawArcRAngles[#1](#2,#3)(#4,#5){%
 \begingroup
  \pgfmathparse{#4}\edef\tkz@FirstAngle{\pgfmathresult}%
  \pgfmathparse{#5}\edef\tkz@SecondAngle{\pgfmathresult}%
  \pgfmathgreaterthan{\tkz@FirstAngle}{0}
  \ifdim\pgfmathresult pt=1 pt\relax%
    \pgfmathgreaterthan{\tkz@FirstAngle}{\tkz@SecondAngle}
    \ifdim\pgfmathresult pt=1 pt\relax%
      \pgfmathsubtract{\tkz@FirstAngle}{360}
      \edef\tkz@FirstAngle{\pgfmathresult}%
  \fi
 \else
     \pgfmathgreaterthan{\tkz@FirstAngle}{\tkz@SecondAngle}
    \ifdim\pgfmathresult pt=1 pt\relax%
      \pgfmathadd{\tkz@SecondAngle}{360}
      \edef\tkz@SecondAngle{\pgfmathresult}%
  \fi
 \fi
 \pgfmathsubtract{\tkz@FirstAngle}{\tkz@delta}
 \edef\tkz@FirstAngle{\pgfmathresult}%
 \pgfmathadd{\tkz@SecondAngle}{\tkz@delta}
 \edef\tkz@SecondAngle{\pgfmathresult}
      \draw[shift = {(#2)},arc style,/tkzdrawarc/.cd,#1]%
       (\tkz@FirstAngle:#3) arc (\tkz@FirstAngle:\tkz@SecondAngle:#3);
\endgroup
}
%<--------------------------------------------------------------------------–>

\makeatother
\endinput
